﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace QuadRemote
{
    class Tools
    {
        public static Font getPrimaryFont()
        {
            return new Font("Calibri", 12);
        }

        public static short bytesToShortRev(byte[] bytes, int offset)
        {
            if (bytes.Length < offset + 2) return 0;
            return bytesToShort(new byte[] { bytes[offset + 1], bytes[offset] });
        }

        public static short bytesToShort(byte[] bytes, int offset)
        {
            if (bytes.Length < offset + 2) return 0;
            return bytesToShort(new byte[] { bytes[offset], bytes[offset + 1] });
        }

        public static float bytesToRealFloat(byte[] bytes, int offset)
        {
            float temp = System.BitConverter.ToSingle(bytes, offset);
            return temp;
        }

        public static float bytesToFloat(byte[] bytes, int offset)
        {
            //return System.BitConverter.ToSingle(bytes, offset);
            int a = bytesToInt32Rev(bytes, offset);

            return (float)a / 65536.0f;
        }

        public static int bytesToUnsignedShort(byte[] bytes, int offset)
        {
            if (bytes.Length < offset + 2) return 0;
            return bytesToUnsignedShort(new byte[] { bytes[offset], bytes[offset + 1] });
        }


        public static short bytesToShort(byte[] bytes)
        {
            if (bytes.Length < 2) return 0;
            short s = (short)(bytes[0] << 8 | bytes[1]);
            return s;
        }

        public static int bytesToUnsignedShort(byte[] bytes)
        {
            if (bytes.Length < 2) return 0;
            int s = (int)(bytes[0] << 8 | bytes[1]);
            return s;
        }

        public static int bytesToInt32(byte[] bytes, int offset)
        {
            if (bytes.Length < offset + 4) return 0;
            return bytesToInt32(new byte[] { bytes[offset], bytes[offset + 1], bytes[offset + 2], bytes[offset + 3] });
        }

        public static int bytesToInt32Rev(byte[] bytes, int offset)
        {
            if (bytes.Length < 4 + offset) return 0;
            int s = (int)((bytes[offset+3] << 24) | (bytes[offset+2] << 16) | (bytes[offset+1] << 8) | bytes[offset]);
            return s;

        }

        public static int bytesToInt32(byte[] bytes)
        {
            if (bytes.Length < 4) return 0;
            int s = (int)((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]);
            return s;
        }

        public static byte[] shortToBytes(short s)
	    {
            byte[] ret = new byte[2];
		    ret[0] = (byte)((s >> 8) & 0xFF);
		    ret[1] = (byte)(s & 0xFF);
		    return ret;
	    }

        public static byte[] floatToBytes(float f)
        {
            return shortToBytes((short)(f * 256.0 * 127.0));
        }

        public static String bytesToString(byte[] bytes, int pos)
        {
            String s;
            int l = 0;
            while (bytes[pos+l] != 0x00)
            {
                l++;
            }
            return System.Text.Encoding.ASCII.GetString(bytes, pos, l);
        }

        public static string getHexString(byte b)
        {
            return getHexString(new byte[] { b });
        }

        public static string getHexString(byte[] bytes, int offset, int length)
        {
            byte[] n = new byte[length];

            for (int i = 0; i < length; i++)
                n[i] = bytes[offset + i];

            return getHexString(n);
        }

        public static string getHexString(byte[] bytes)
        {
            return BitConverter.ToString(bytes);
        }

        internal static string floatToString(float p)
        {
            return p.ToString().Replace(",", ".");
        }

        public static int stringToBytes(String str, ref byte[] b, int pos)
        {
            byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
            System.Array.Copy(bytes, 0, b, pos, bytes.Length);
            b[pos + bytes.Length + 1] = 0;
            return pos + bytes.Length + 1;
        }
    }
}
